﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Microsoft.Owin;
using System.IO;

namespace WebApplication.Controllers
{
    public class NodeController : ApiController
    {
        private static object o = new object();
        public Models.DataClasses1DataContext data = new Models.DataClasses1DataContext();
        public static List<Models.Nodes> _nodes = new List<Models.Nodes>();

        // GET: api/Node
        // регистрация узла, в ответ получает id
        public string Get()
        {

            var node = new Models.Nodes();
            _nodes.Add(node);
            return node.Id;

        }

        /*
          post: api/Node
          сообзение от узла 
          id - id узда 
          state:
                 0 - свободен
                        в ответ получает строку с заданием или wait
                 1 - работю
                        в ответ получает true или false нужно ли ему продолжать
                 2 - возвращаю результат
                        workId, value,file
                        в ответ получает true

         */
        public async Task<string> PostFormData()
        {
            try
            {
                string id = "";
                string state = "";
                string value = "";
                string workId = "";
                string fileLength = "";

                _nodes.RemoveAll(t => !t.Activ);


                var b = await Request.Content.ReadAsByteArrayAsync();

                string pageHtml = "";
                if (b.Length > 300)
                {
                    var bb = new byte[300];
                    Array.Copy(b, bb, 300);
                    pageHtml = Encoding.ASCII.GetString(bb);
                }
                else
                 pageHtml = Encoding.ASCII.GetString(b);
                var kv = HttpUtility.ParseQueryString(pageHtml);
                foreach (var key in kv.AllKeys)
                {
                    foreach (var val in kv.GetValues(key))

                    {

                        if (key == "id")
                            id = val;

                        if (key == "state")
                            state = val;
                        if (key == "workId")
                            workId = val;
                        if (key == "value")
                            value = val;
                        if (key == "fileLenght")
                            fileLength = val;

                    }
                }


                var node = _nodes.FirstOrDefault(t => t != null && t.Id == id);
                if (node == null)
                    return "false";
                if (state == "0")
                {
                    if (node.Spare)
                    {
                        try
                        {
                            lock (o)
                            {
                                var v = data.Work.Where(t => t.state == 1);
                                foreach (var d in v)
                                {
                                    if (!_nodes.Any(t => t.WorkID == d.id))
                                    {
                                        node.WorkID = d.id;
                                        break;
                                    }

                                }
                            }

                        }
                        catch (Exception ex)
                        {
                            return ex.Message;
                        }
                    }
                    return node.Run();

                }
                if (state == "1")
                {
                    if (node != null)
                    {
                        node.Send();
                    }
                    return "true";
                }

                if (state == "2")
                {
                    if (workId != "" && value != "" && fileLength != "")
                    {  int l = Convert.ToInt32(fileLength);
                        var filearray = new byte[l];
                      
                        Array.Copy(b, b.Length - l, filearray, 0, l);

                
                     
                        node.NewResult(workId, value, filearray);


                    }
                    else
                        return "true";
                }
                return "true";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }


    }
}
